iT邦幫忙

2023 iThome 鐵人賽

DAY 1
0
自我挑戰組

Django系列 第 8

Day8~Django 漫漫長路- migrations掌握回朔的技巧

  • 分享至 

  • xImage
  •  

大家好,我是Leo
今天我來介紹的是django migrations 底下會帶大家操作及一些用法/images/emoticon/emoticon30.gif
OK~~~ Let's go now!!!


What's Migrations??

Migration,資料遷移功能的一種,是用來同步Django專案下models.py及資料庫。換句話說,只要Django專案中的models.py有變動,都要執行一次Migration(資料遷移),來同步資料庫。

  • 執行makemigrations 會長出有更動的model部分,還不會遷移至資料庫
python .\manage.py makemigrations
  • 執行migrate 才會真正的遷移至資料庫
python .\manage.py migrate 
  • showmigrations 可以查看當前項目所有的app及相對應已經生效的migration文件,其中[x]表示migrte通過,[]表示未通過。
python .\manage.py showmigrations

這些遷移的migrations記錄檔都會放置在django_migrations下
https://ithelp.ithome.com.tw/upload/images/20221220/20154853RoiR9gUKqr.jpg


Migrations reset

用途 : 不對現有的數據庫改動,而又可以重置migraion文件。

重置遷移

python manage.py migrate website zero

查看狀態,就屬於未執行的階段

python .\manage.py showmigrations

https://ithelp.ithome.com.tw/upload/images/20221220/20154853mKM1y3YzLE.jpg

也可以回溯版本,例如我現在在0004今天要回去0002版(版本前打上appname),如下圖

python manage.py migrate website 0002_user_roles

https://ithelp.ithome.com.tw/upload/images/20221220/201548533fl2jpGN3M.jpg

重新在資料庫中django_migrations記錄 migrate執行記錄,但並不會執行migrations文件中的代碼。

python manage.py migrate 0002_user_roles –fake 

Write Migrations Create Data

我在這邊直接重新創建一個database

drop database mydb;
create database mydb;
python manage.py makemigrations
python manage.py migrate

在我環境migrations底下有兩個檔案分別是,如下圖
https://ithelp.ithome.com.tw/upload/images/20221220/20154853o5sPpeoAiZ.jpg

還記得我們昨天user_roles嗎?我們今天直接用migrations生長的方式將它生成至資料庫
在 migrations資料夾內add new 0002_add_user_roles.py
在下面要注意的是"0001_initial" 名字需跟0002_add_user_roles 上一筆檔名一模一樣
website_user_roles -> 需改成你們的tablename

from __future__ import unicode_literals
from django.db import models, migrations

def add_user_roles(apps, schema_editor):
    user_roles = apps.get_model("website", "User_Roles")
    role1 = user_roles(id=1,name='manage',salary=30000)
    role2 = user_roles(id=2,name='engineer',salary=20000)
    role3 = user_roles(id=3, name='parttime', salary=10000)
    role1.save()
    role2.save()
    role3.save()

def delete_all(apps, schema_editor):
    return 'SET FOREIGN_KEY_CHECKS=0; DELETE from website_user_roles;'

class Migration(migrations.Migration):
    dependencies = [
        ('website', '0001_initial'),
    ]
    operations = [
        migrations.RunPython(add_user_roles,delete_all),
    ]

寫完後直接執行下圖代碼

python manage.py migrate

我們發現資料直接生成至database內
https://ithelp.ithome.com.tw/upload/images/20221220/20154853TvtY2XXPyk.jpg


今天主要是介紹makemigrations,及一些使用方式,與大家用migrations寫入進資料庫
明天預計會做從filefields上傳的api開始講解起
我們明天見,各位掰掰~~~/images/emoticon/emoticon29.gif


上一篇
Day7~Django 漫漫長路- 手把手hoding serializers
下一篇
Day9~Django 漫漫長路- 我把檔案都上傳到那裡了
系列文
Django30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言